/**
 * 
 * interface是一种定义结构的方式，主要作用是为：类，对象，函数等规定一种契约，这样可以
 * 确保代码的一致性和类型安全，但是注意interface只能定义格式，不能包含任何实现。
 * 
 */

// PersonInterface 接口
interface PersonInterface {
    name: string,
    age: number,
    speak(n: number): void
}

class Person implements PersonInterface {
    constructor(public name: string, public age: number) {

    }
    speak(n: number): void {
        for (let i = 0; i < n; i++) {
            console.log(`你好，我叫${this.name}，年龄${this.age}`)
        }
    }
}
const p1 = new Person('tom', 15)
p1.speak(10)


interface UserInterface {
    name: string,
    readonly gender: string,
    age?: number,
    run: (n: number) => void
}

const user: UserInterface = {
    name: '张三',
    gender: '男',
    run(n) {
        console.log(n)
    },
}

// 接口限制函数
interface CountInterface {
    (a: number, b: number): number;
}

const count: CountInterface = (x, y) => {
    return x + y
}


// 接口继承

interface StudentInterface extends PersonInterface {
    grade: string
}

const stu: StudentInterface = {
    name: '张三',
    age: 18,
    grade: '初二',
    speak(n) { },
}


// 接口可合并性
interface PersonInterface1 {
    name: string,
    age: number
}

interface PersonInterface1 {
    grade: string
}
const stu1: PersonInterface1 = {
    name: '1',
    age: 2,
    grade: '3'
}


/**
 * 总结：何时使用接口
 * 1.定义对象的格式：描述数据模型，API相应格式，配置对象...等等,是开发中用的最多的场景.
 * 2.类的契约：规定一个类需要实现哪些属性和方法。
 * 3.自动合并：一般用于扩展第三方库的类型，这种特性在大型项目中可能会用到。
 * 
 */